package com.gitee.qdbp.jdbc.api;

import com.gitee.qdbp.able.jdbc.condition.TableJoin;
import com.gitee.qdbp.jdbc.stream.CrudStream;
import com.gitee.qdbp.jdbc.stream.SqlStream;

/**
 * 数据库操作对象的构造器
 * qdbp-jdbc简称为qdbc
 * 使用方法示例:
 * <pre>
    &#64;Autowired
    private QdbcBoot qdbcBoot;

    private void xxMethod() {
        // 单表增删改查
        Date today = DateTools.toStartTime(new Date());
        Date yesterday = DateTools.addDay(today, -1);
        { // 查询单个对象
            XxxBean xxxBean = qdbcBoot.crudStream(XxxBean.class)
                .whereById(id)
                .find();
        }
        { // 查询列表(创建时间为今天的)
            List&lt;YyyBean&gt; yyyBeans = qdbcBoot.crudStream(YyyBean.class)
                .where("createTime").greaterEqualsThen(today).end()
                .orderBy("createTime DESC")
                .list();
        }
        { // 分页查询(创建时间为昨天的第1页的10条记录)
            PartList&lt;YyyBean&gt; yyyBeans = qdbcBoot.crudStream(YyyBean.class)
                .where("createTime").greaterEqualsThen(yesterday)
                    .and("createTime").lessThen(today)
                    .end()
                .orderBy("createTime ASC")
                .pageBy(1, 10)
                .list();
        }
        { // 删除昨天待处理和失败的记录
            int rows = qdbcBoot.crudStream(ZzzBean.class)
                .where("state").in(ZzzState.PENDING, ZzzState.ERROR)
                    .and("createTime").greaterEqualsThen(yesterday)
                    .and("createTime").lessThen(today)
                    .end()
                .physicalDelete(); // 物理删除
        }

        { // SQL模板查询
            Map&lt;String, Object&gt; params = ...;
            String sqlId = "SysUserMapper:queryUserRoles";
            List&lt;SysRoleEntity&gt; list = qdbcBoot.sqlStream()
                .sqlId(sqlId).params(params)
                .pageBy(1,10)
                .resultAs(SysRoleEntity.class)
                .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
        }
    }
 * </pre>
 *
 * @author 赵卉华
 * @version 190601
 * @see TableJoin
 */
public interface QdbcBase extends SqlBoot {

    /**
     * 单表增删改查流式操作<pre>
     * 查询条件
     * qdbcBoot.crudStream(XxxEntity.class)
     * .whereBy(entity) | whereBy(map) // 实体条件
     * .where(fieldName) // 字段条件
     * -- equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * -- and(fieldName)
     * ---- equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * -- and()
     * ---- subCondition // 子查询条件
     * ------ and(fieldName) | or(fieldName)
     * -- ifTrue(test) | ifHasValue(value) | ifHasValue() // 选择性添加条件
     * ---- and(fieldName)
     * ------ equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * -- end()
     * -- logicalDelete|physicalDelete / find|findFieldValue / count|groupCount / list|listFieldValues
     * -- orderBy
     * ---- list | listFieldValues
     * -- pageBy
     * ---- list | listFieldValues
     * 查询指定字段 (后续操作只能是查询,不能是删除和统计)
     * qdbcBoot.crudStream(XxxEntity.class)
     * .select(fieldNames) | selectExclude(fieldNames) // 查询指定字段或排除字段
     * -- list | listFieldValues
     * -- whereBy(entity) | whereBy(map) // 实体条件
     * -- where(fieldName) // 字段条件
     * ---- equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * ---- end()
     * ---- find | findFieldValue / list | listFieldValues
     * ---- orderBy
     * ------ list | listFieldValues
     * ---- pageBy
     * ------ list | listFieldValues
     * 新增修改
     * qdbcBoot.crudStream(XxxEntity.class)
     * .entity(xxxEntity) | entity(map) // 指定实体类
     * -- insert / update
     * -- whereBy(entity) | whereBy(map)  // 实体条件
     * -- where(fieldName) // 字段条件
     * ---- equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * ---- end()
     * ---- update
     * 修改
     * qdbcBoot.crudStream(XxxEntity.class)
     * .updateSet(fieldName)
     * -- to(fieldValue) | toNull() | add(number)
     * ---- set(fieldName)
     * ------ to(fieldValue) | toNull() | add(number)
     * ---- end()
     * -- update
     * 批量操作
     * qdbcBoot.crudStream(XxxEntity.class)
     * .entities(list) // 指定实体列表
     * -- insert / update
     * 递归查询
     * qdbcBoot.crudStream(XxxEntity.class)
     * .recursiveBy(codeField, parentField) // 递归查询
     * -- startByCodes 指定开始节点编号
     * ---- listChildren | listParents | listChildrenCodes | listParentCodes
     * ---- filterBy(entity) | filterBy(map) // 数据过滤实体条件
     * ---- filterBy(fieldName) // 数据过滤字段条件
     * ------ equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * ------ end()
     * ---- searchBy(entity) | searchBy(map) // 结果搜索实体条件
     * ---- searchBy(fieldName) // 结果搜索字段条件
     * ------ equals | lessThen | greaterThen | like | startsWith | endsWith | in | between | notEquals | ...
     * ------ end()
     * ------ listChildren | listParents | listChildrenCodes | listParentCodes
     * ---- orderBy // 排序条件
     * ------ listChildren | listParents | listChildrenCodes | listParentCodes</pre>
     * 
     * @param <T> 单表对应的具体类型
     * @param clazz 单表对应的对象类型
     * @return 流式操作对象
     * @since 4.0.0
     */
    <T> CrudStream<T> crudStream(Class<T> clazz);

    /**
     * Sql模板的流式操作<pre>
     * qdbcBoot.sqlStream()
     * .sqlId(queryId) // 设置SqlId
     * -- find | list | insert | update | delete
     * -- params // 设置参数
     * ---- find | list | insert | update | delete
     * ---- pageBy // 设置分页参数
     * ------ find | list
     * ------ resultAs // 结果转换
     * -------- find | list // 查找数据/查找列表
     * .sqlId(queryId, countId) // 同时设置查询和统计SqlId (后续操作只能是分页查询)
     * -- params // 设置参数
     * ---- pageBy // 设置分页参数
     * ------ list
     * ------ resultAs // 结果转换
     * -------- list // 查找数据/查找列表</pre>
     * 
     * @return 流式操作对象
     * @since 4.0.0
     */
    SqlStream sqlStream();

    /**
     * 构造单表增删改查对象
     * 
     * @param <T> 单表对应的具体类型
     * @param clazz 单表对应的对象类型
     * @return 单表增删改查对象
     */
    <T> CrudDao<T> crudDao(Class<T> clazz);

    /**
     * 构造表关联查询对象
     * 
     * @param <T> 查询结果的具体类型
     * @param tables 表关联对象
     * @param resultType 查询结果的对象类型
     * @return 表关联查询对象
     */
    <T> JoinQueryer<T> joinQueryer(TableJoin tables, Class<T> resultType);

    /**
     * 获取SQL执行接口
     * 
     * @return SqlDao
     * @since 3.2.0
     */
    SqlDao sqlDao();

    /**
     * 获取SqlBuffer数据库操作类
     * 
     * @return SqlBufferJdbcOperations
     */
    SqlBufferJdbcOperations sqlJdbc();
}
